﻿#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
#include<string>
//常用查找算法
//算法简介：
//find //查找元素
//find_if //按条件查找元素
//adjacent_find //查找相邻重复元素
//binary_search //二分查找法
//count //统计元素个数
//count_if //按条件统计元素个数



//find
// find(iterator beg, iterator end, value);
// 按值查找元素，找到返回指定位置迭代器，找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// value 查找的元素
// 
// 
//void test01()
//{
//	vector<int>v;
//	for (int i = 0; i < 10; i++)
//	{
//		v.push_back(i + 1);
//	}
//	vector<int>::iterator it = find(v.begin(), v.end(), 5);
//	if (it == v.end())
//	{
//		cout << "未找到" << endl;
//	}
//	else
//	{
//		cout << "找到：" << *it << endl;
//	}
//}
//class person
//{
//public:
//	person(string name, int age)
//	{
//		this->m_name = name;
//		this->m_age = age;
//	}
//	//重载 ==  让底层find知道如何对比person数据类型
//	bool operator==(const person& p) 
//	{
//		if (this->m_name == p.m_name && this->m_age == p.m_age)
//		{
//			return true;
//		}
//		else
//		{
//			return false;
//		}
//	}
//	string m_name;
//	int m_age;
//};
//void test02()
//{
//	person p1("aa", 1);
//	person p2("bb", 2);
//	person p3("cc", 3);
//	person p4("dd", 4);
//	person p5("ee", 5);
//
//	vector<person>v;
//	v.push_back(p1);
//	v.push_back(p2);
//	v.push_back(p3);
//	v.push_back(p4);
//	v.push_back(p5);
//
//	vector<person> ::iterator it = find(v.begin(), v.end(), p1);
//	if (it == v.end())
//	{
//		cout << "未找到" << endl;
//	}
//	else
//	{
//		cout << "已找到：姓名：" << it->m_name << "  年龄：" << it->m_age << endl;
//	}
//}
//int main()
//{
//	test01();
//	test02();
//	system("pause");
//	return 0;
//}



//find _if
// find_if(iterator beg, iterator end, _Pred);
// 按值查找元素，找到返回指定位置迭代器，找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// _Pred 函数或者谓词（返回bool类型的仿函数）

//class GreaterFive
//{
//public:
//	bool operator()(int val)
//	{
//		return val > 5;
//	}
//};
//void test01()
//{
//	vector<int>v;
//	for (int i = 0; i < 10; i++)
//	{
//		v.push_back(i);
//	}
//	vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
//	if(it==v.end())
//	{
//		cout << "未找到" << endl;
//	}
//	else
//	{
//		for (; it != v.end(); it++)
//		{
//			cout << "找到：" << *it << endl;
//		}
//	}
//}
//class person
//{
//public:
//	person(string name, int age)
//	{
//		this->m_name = name;
//		this->m_age = age;
//	}
//	string m_name;
//	int m_age;
//};
//class Greater20
//{
//public:
//	bool operator()(person& p)
//	{
//		return p.m_age > 20;
//	}
//};
//void test02()
//{
//	vector<person>v;
//	person p1("aa", 10);
//	person p2("bb", 20);
//	person p3("cc", 30);
//	person p4("dd", 40);
//	person p5("ee", 50);
//
//	v.push_back(p1);
//	v.push_back(p2);
//	v.push_back(p3);
//	v.push_back(p4);
//	v.push_back(p5);
//
//	vector<person>::iterator it = find_if(v.begin(), v.end(), Greater20());
//	if (it == v.end())
//	{
//		cout << "未找到" << endl;
//	}
//	else
//	{
//		for (; it != v.end(); it++)
//		{
//			cout << "找到：姓名：" << it->m_name << "  年龄：" << it->m_age << endl;
//		}
//	}
//}
//int main()
//{
//	test01();
//	test02();
//	system("pause");
//	return 0;
//}

//adjacent_find
//查找相邻重复元素
//函数原型：
//adjacent_find(iterator beg, iterator end);
// 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
// beg 开始迭代器
// end 结束迭代器​

//void test01()
//{
//	vector<int> v;
//	v.push_back(1);
//	v.push_back(2);
//	v.push_back(5);
//	v.push_back(2);
//	v.push_back(4);
//	v.push_back(4);
//	v.push_back(3);
//	v.push_back(3);
//	v.push_back(3);
//	v.push_back(1);
//	v.push_back(2);
//	v.push_back(2);
//	v.push_back(5);
//
//	//查找相邻重复元素
//	vector<int>::iterator it = adjacent_find(v.begin(), v.end());
//	if (it == v.end()) {
//		cout << "找不到!" << endl;
//	}
//	else {
//			cout << "找到相邻重复元素为:" << *it << endl;
//	}
//}
//int main()
//{
//	test01();
//	system("pause");
//	return 0;
//}

//binary_search
//功能描述
//查找指定元素是否存在
//函数原型：
//bool binary_search(iterator beg, iterator end, value);
// 查找指定的元素，查到 返回true 否则false
// 注意: 在无序序列中不可用
// beg 开始迭代器
// end 结束迭代器
// value 查找的元素

//void test01()
//{
//	vector<int>v;
//	for (int i = 0; i < 10; i++)
//	{
//		v.push_back(i);
//	}
//	//二分查找
//	//查找的元素序列必须是有序序列
//	bool ret = binary_search(v.begin(), v.end(),9);
//	if (ret)
//	{
//		cout << "找到了" << endl;
//	}
//	else
//	{
//		cout << "未找到" << endl;
//	}
//}
//int main() {
//	test01();
//	system("pause");
//	return 0;
//}


//count
//功能描述：
//统计元素个数
//函数原型：
//count(iterator beg, iterator end, value);
// 统计元素出现次数
// beg 开始迭代器
// end 结束迭代器
// value 统计的元素

//内置数据类型
//void test01()
//{
//	vector<int> v;
//	v.push_back(1);
//	v.push_back(2);
//	v.push_back(4);
//	v.push_back(5);
//	v.push_back(3);
//	v.push_back(4);
//	v.push_back(4);
//	int num = count(v.begin(), v.end(), 4);
//
//	cout << "4的个数为： " << num << endl;
//}
//自定义数据类型
//class Person
//{
//public:
//	Person(string name, int age)
//	{
//		this->m_Name = name;
//		this->m_Age = age;
//	}
//	bool operator==(const Person& p)
//	{
//		if (this->m_Age == p.m_Age)
//		{
//			return true;
//		}
//		else
//		{
//			return false;
//		}
//	}
//	string m_Name;
//	int m_Age;
//};
//void test02()
//{
//	vector<Person> v;
//
//	Person p1("刘备", 35);
//	Person p2("关羽", 35);
//	Person p3("张飞", 35);
//	Person p4("赵云", 30);
//	Person p5("曹操", 25);
//
//	v.push_back(p1);
//	v.push_back(p2);
//	v.push_back(p3);
//	v.push_back(p4);
//	v.push_back(p5);
//
//	Person p("诸葛亮", 35);
//	int num = count(v.begin(), v.end(), p);
//	cout << "num = " << num << endl;
//}
//int main() {
//
//	test01();
//	test02();
//	system("pause");
//	return 0;
//}


//count_if
//功能描述：
//按条件统计元素个数
//函数原型：
//count_if(iterator beg, iterator end, _Pred);
// 按条件统计元素出现次数
// beg 开始迭代器
// end 结束迭代器
// _Pred 谓词

//class Greater4
//{
//public:
//	bool operator()(int val)
//	{
//		return val >= 4;
//	}
//};
////内置数据类型
//void test01()
//{
//	vector<int> v;
//	v.push_back(1);
//	v.push_back(2);
//	v.push_back(4);
//	v.push_back(5);
//	v.push_back(3);
//	v.push_back(4);
//	v.push_back(4);
//
//	int num = count_if(v.begin(), v.end(), Greater4());
//	cout << "大于4的个数为： " << num << endl;
//}
////自定义数据类型
//class Person
//{
//public:
//	Person(string name, int age)
//	{
//		this->m_Name = name;
//		this->m_Age = age;
//	}
//
//	string m_Name;
//	int m_Age;
//};
//
//class AgeLess35
//{
//public:
//	bool operator()(const Person& p)
//	{
//		return p.m_Age < 35;
//	}
//};
//void test02()
//{
//	vector<Person> v;
//
//	Person p1("刘备", 35);
//	Person p2("关羽", 35);
//	Person p3("张飞", 35);
//	Person p4("赵云", 30);
//	Person p5("曹操", 25);
//
//	v.push_back(p1);
//	v.push_back(p2);
//	v.push_back(p3);
//	v.push_back(p4);
//	v.push_back(p5);
//
//	int num = count_if(v.begin(), v.end(), AgeLess35());
//	cout << "小于35岁的个数：" << num << endl;
//}
//int main()
//{
//	test01();
//	test02();
//	system("pause");
//	return 0;
//}
